package com.atguigu.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 1.整合mybatieplus
 *  导入依赖
 *  配置
 *      配置数据源
 *          导入数据库驱动
 *          在application.yml配置数据源相关信息
 *      配置mybatiesplus
 *          注解MapperScan
 *          告诉mybatiesplussql映射文件位置
 *
 * 2.逻辑删除
 *      配置全局逻辑删除（省略）
 *      配置逻辑删除的Bean（省略）
 *      给Bean 实体类加@TableLogic
 *
 * 3.JSR303
 *      1.给Bean添加校验注解 javax.validation.constraints.NotBlank; 并定义自己的message提示
 *      2.开启校验功能 在需要校验的bean添加 @Valid
 *          校验之后会有默认响应
 *      3.给校验的bean后紧跟一个BindingResult 得到校验的结果
 *      4.分组校验
 *          1.@NotBlank(message = "品牌名必须提交",groups = {AddGroup.class,UpdateGroup.class})  //至少一个字符 不包含空格
 *          给校验注解标注什么情况需要进行校验
 *          2.@Validated({UpdateGroup.class}) @RequestBody BrandEntity brand
 *          3.默认没有指定分组的校验注解，在分组校验的情况下 不会生效
 *
 * 4.统一的异常处理
 * @ControllerAdvice
 *
 * 5.自定义校验
 *      1.编写一个自定义校验注解  TODO创建注解 ListValue
 *      2.编写一个自定义校验器  TODO创建注解解析 ListValueConstraintValidator
 *      3.关联自定义的校验器和自定义注解 TODO标注注解
 *
 * 6.模板引擎
 *      1.thymeleaf-stater：关闭缓存
 *      2.静态资源都在放static文件夹下，就可以按照路径直接访问
 *      3.页面放在template下，直接访问
 *      Spring Boot，访问项目的时候，默认会找index
 *      静态资源配置
 *      private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
 * 			"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
 * 	    4. 页面修改实时更新 ，不重启服务器
 * 	        引入dev-tools
 * 	        修改完页面 使用ctrl shfit F9 如果代码配置 重启
 *
 * 7.整合redis
 *      1.引入data-redis-starter
 *      2.简单配置redis的host等信息
 *      3.使用SpringBoot自动配置好的StringReidsTemplate
 *
 * 8.整合redisson作为分布式锁等功能框架
 *      1.引入依赖
 *      <dependency>
 *             <groupId>org.redisson</groupId>
 *             <artifactId>redisson</artifactId>
 *             <version>3.12.0</version>
 *         </dependency>
 *      2.配置redisson
 *
 * 9.整合SpringCache简化缓存开发
 *      1.引入依赖
 *          spring-boot-starter-cache,spring-boot-starter-data-redis
 *      2.写配置
 *        自动配置了哪些
 *          CacheAutoConfiguration会导入RedisCacheConfiguration
 *          自动配置好了缓存管理器RedisCacheManager
 *        配置使用redis作为缓存
 *      3.测试使用缓存
             @Cacheable: Triggers cache population. 触发将数据保存到缓存的操作
             @CacheEvict: Triggers cache eviction. 触发将数据从缓存中删除
             @CachePut: Updates the cache without interfering with the method execution. 不影响方法执行更新缓存
             @Caching: Regroups multiple cache operations to be applied on a method. 组合以上多个操作
             @CacheConfig: Shares some common cache-related settings at class-level. 在类级别  共享缓存的相同配置
 *           1. 开启缓存功能  @EnableCaching
 *           2. 只需要使用注解 就能完成缓存操作
 *      4.原理
 *          CacheAutoConfiguration -》 RedisCacheConfiguration -》 自动配置了 RedisCacheManager -》 初始化所有缓存
 *          -》 每个缓存决定使用什么配置 -》 如果RedisCacheConfiguration有就用已有的，没有就用默认配置 -》 想改缓存的配置，
 *          只要给容器中放一个RedisCacheConfiguration即可 -》 就会应用到当前RedisCacheManager管理的所有缓存分区中
 *
 **/

@EnableRedisHttpSession
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.fegin")
@EnableDiscoveryClient
@MapperScan("com.atguigu.gulimall.product.dao")
@SpringBootApplication
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
